package com.example.ad.sdk.domain.extensions

import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import androidx.activity.OnBackPressedCallback
import androidx.fragment.app.Fragment
import androidx.lifecycle.LiveData


/**
 * BackPressedBlocker类用于拦截返回键操作并执行自定义操作
 * 继承自OnBackPressedCallback，并覆盖handleOnBackPressed方法
 * @param onAction 当返回键被拦截时执行的操作
 */
class BackPressedBlocker(private val onAction: () -> Unit) : OnBackPressedCallback(true) {
    /**
     * 当返回键被拦截时调用此方法
     * 该方法不执行任何操作，只是调用了传入的onAction
     */
    override fun handleOnBackPressed() {
        // block, so do nothing
        onAction()
    }
}

/**
 * 使用LiveData来控制是否拦截返回键
 * 在loading时候的某些情况下需要block返回键
 * 大部分时候不需要block用户操作, api请求回自动cancel
 *
 * 在Fragment中使用，根据LiveData的值来决定是否拦截返回键
 * @param liveData 用于控制返回键拦截的LiveData
 * @param block 当返回键被拦截时执行的操作，默认为空操作
 */
fun Fragment.blockBackPressWithLiveData(liveData: LiveData<Boolean>, block: () -> Unit = {}) =
    BackPressedBlocker(block).also { blocker ->
        liveData.observe(viewLifecycleOwner) { enable ->
            if (enable) {
                blocker.remove()
            } else {
                blocker.remove()
                activity?.onBackPressedDispatcher?.addCallback(viewLifecycleOwner, blocker)
            }
        }
    }


/**
 * 在Context中查找Activity
 * 递归地遍历ContextWrapper，直到找到Activity
 * @throws IllegalStateException 如果找不到Activity，则抛出异常
 * @return 找到的Activity
 */
internal fun Context.findActivity(): Activity {
    var context = this
    while (context is ContextWrapper) {
        if (context is Activity) return context
        context = context.baseContext
    }
    throw IllegalStateException("Permissions should be called in the context of an Activity")
}